/**
  * 题目Id：67
  * 题目：二进制求和
  * 日期：2023-02-23 17:35:52
*/
//给你两个二进制字符串 a 和 b ，以二进制字符串的形式返回它们的和。 
//
// 
//
// 示例 1： 
//
// 
//输入:a = "11", b = "1"
//输出："100" 
//
// 示例 2： 
//
// 
//输入：a = "1010", b = "1011"
//输出："10101" 
//
// 
//
// 提示： 
//
// 
// 1 <= a.length, b.length <= 10⁴ 
// a 和 b 仅由字符 '0' 或 '1' 组成 
// 字符串如果不是 "0" ，就不含前导零 
// 
//
// Related Topics 位运算 数学 字符串 模拟 👍 965 👎 0

package leetcode.editor.cn;
public class AddBinary {
    public static void main(String[] args) {
        Solution solution = new AddBinary().new Solution();
        System.out.println("Hello world");
    }
    //leetcode submit region begin(Prohibit modification and deletion)
class Solution {
    public String addBinary(String a, String b) {
        /**
         * 将两个字符串补全 长度相等
         * 设置进位flag默认为0
         * 循环从末尾开始{
         *  截取两个字符串的变为字符减去48变为数字
         *  得出三个数字的和 flag+两个字符
         *  判断是否有进位
         *  添加这一位}
         *  判断最后一位是否有进位 添加
         *  返回  逆转之后的，化为字符串
         */
        int ca,cb,n,flag=0;
        StringBuffer buf=new StringBuffer();
        if(a.length()==0)
            return b;
        if(b.length()==0)
            return a;
        while(a.length()>b.length()) {
            b="0"+b;
        }
        while(a.length()<b.length())
            a="0"+a;
        for (int i=a.length()-1;i>=0;i--){
            ca=a.charAt(i)-48;
            cb=b.charAt(i)-48;
            n=ca+cb+flag;
            flag=n/2;
            buf.append(n%2);
        }
        if (flag==1)
            buf.append(flag);
        return buf.reverse().toString();
    }
}
//leetcode submit region end(Prohibit modification and deletion)

} 
